package com.javaio.demo.bio.server;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

/**
 * 副线程用Runnable 用来创建线程 接受一对一用户信息交换 一个线程对应一个用户
 */
public class ChatHandler implements Runnable {

    private final String TUICHU = "tuichu";
    /**
     * 用来操作服务端主线程端的用户
     */
    private ChatServer chatServer;
    /**
     * 用户间的信息交换
     */
    private Socket socket;

    /**
     * 创建实例读写信息 将 this.  赋值给 socket  chatServer 则可以拿到实例
     *
     * @param chatServer
     * @param socket
     */
    public ChatHandler(ChatServer chatServer, Socket socket) {
        this.chatServer = chatServer;
        this.socket = socket;
    }

    /**
     * 一个用户对应一个线程 可以利用实现了Runnable接口
     */
    @Override
    public void run() {
        try {
            //将该用户加入到在线用户集合(存贮用户)  这里就是一个用户对应一个线程 实现了Runnable接口
            chatServer.addClient(socket);
            //读取用户发送的消息这里是查看用户有没有发送消息
            BufferedReader reader = new BufferedReader(
                    new InputStreamReader(socket.getInputStream())
            );
            //循环读取该用户消息
            String msg = null;
            //将reader.readLine()类似回车 将回车前的消息  赋予msg   如果赋予的是null 则不读取消息 （读不到）
            while ((msg = reader.readLine()) != null) {
                //上面读取到了该用户的消息 现在进行转发该用户的消息到其他在线用户  \n是保证reader.readLine() 能返回
                String fwdMsg = "客户端[" + socket.getPort() + "]：" + msg + "\n";

                //转发
                chatServer.forwardMessage(socket, fwdMsg);
                //用户退出监听
                if (chatServer.readyTuiChu(msg)) {
                    break;
                }
                System.out.print(fwdMsg);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //如果用户退出了则删除该用户在在线用户集合的信息
            try {
                chatServer.removeClient(socket);
            } catch (IOException e) {
                e.printStackTrace();
                System.out.println("该用户["+socket.getPort()+"]退出异常");
            } finally {
            }
        }
    }

}